/**
 * @file sys.c
 * @brief 系统定时器和延时函数实现
 * @date 2025-11-03
 */

#include "stm32f0xx_hal.h"
#include <stdint.h>
#include "sys.h"
#include "../app/app_midi.h"
#include "../sys_manager.h"

/* 外部定时器句柄(由CubeMX生成) */
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim17;

/**
 * @brief 启动系统定时器 (TIM17 1ms中断)
 * @note 用于MIDI状态机周期性任务
 */
void sys_timer_start(void)
{
    HAL_TIM_Base_Start_IT(&htim17);
}

/**
 * @brief 微秒延时（使用 TIM1 计数器）
 * @param us 延时时间（微秒）
 * @note 简化版本，直接启动/停止定时器
 */
void delay_us(uint32_t us)
{
    if (us == 0) return;
    if (us > 65530) us = 65530;  /* 限制最大延时 */

    uint16_t target = 0xFFFF - us - 5;

    HAL_TIM_Base_Start(&htim1);
    __HAL_TIM_SET_COUNTER(&htim1, target);

    uint16_t cnt = target;
    while (cnt < 0xFFFF - 5)
    {
        cnt = __HAL_TIM_GET_COUNTER(&htim1);
    }

    HAL_TIM_Base_Stop(&htim1);
}

/**
 * @brief 毫秒延时
 * @note delay_us 最多延时 65ms，所以需要循环调用
 */
void delay_ms(uint32_t ms)
{
    while (ms--)
    {
        delay_us(1000);  /* 每次延时 1ms */
    }
}

/**
 * @brief TIM17定时器周期回调函数 (HAL库回调)
 * @note 每1ms触发一次，用于MIDI状态机
 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM17)
    {
        if(sys_manager_get_state() != SYS_STATE_BOOT)
        {
            /* 调用MIDI状态机任务 */
            app_midi_task();
        }  
    }
}

/******************************** 文件结束 *********************************/
